#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int a[N],c[N];
bool judge(int x){
    while(x!=1){
        if(x%2==0) x/=2;
        else return false;
    }
    return true;
}
int get(int x){
    int ans=0;
    while(x>=2){
        x/=2;
        ans++;
    }
    return ans;
}
struct x{
    int b[5];
}x[300];
int ans[N];
string s[N];
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    freopen("arena.in","r",stdin);
    freopen("arena.out","w",stdout);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=m;i++)
        cin>>c[i];
    int K=get(n);
    if(!judge(n)) K++;
    for(int i=1;i<=K;i++)
        cin>>s[i];  
    int T;
    cin>>T;
    for(int i=1;i<=T;i++)
        cin>>x[i].b[0]>>x[i].b[1]>>x[i].b[2]>>x[i].b[3];
    for(int i=1;i<=n;i++)
        a[i]^=x[1].b[i%4];
    for(int cur=1;cur<=m;cur++){
        int k=get(c[cur]);
        priority_queue<int>q;
        queue<int>p;
        for(int i=1;i<=c[cur];i++) q.push(-i);
        for(int i=1;i<=k;i++){
            int cnt=0;
            while(q.size()){
                int x=q.top()*(-1);
                q.pop();
                int y=(-1)*q.top();
                q.pop();
                if(s[i][cnt]=='0'){
                    if(a[x]>cnt) p.push(x);
                    else p.push(y);
                }
                if(s[i][cnt]=='1'){
                    if(a[y]>cnt) p.push(y);
                    else p.push(x);
                }
                cnt++;
            }
            while(p.size()){
                int x=p.front();
                p.pop();
                q.push(-x);
            }
        }
        ans[cur]=(-1)*q.top();
        q.pop();
        while(q.size()) q.pop();
        while(p.size()) p.pop();
    }
    int sum=0;
    for(int i=1;i<=m;i++){
        sum^=(i*ans[i]);
        }
    cout<<sum;
    return 0;
}